OPC Studio User's Guide and Reference
Using Callback Methods Instead of Event Handler (OPC UA Alarms & Conditions)
Concepts > OPC Data Client Concepts > OPC Data Client Development Models > Imperative Programming Model > Imperative Programming Model for OPC UA Alarms & Conditions > Subscribing to Information (OPC UA Alarms & Conditions) > Using Callback Methods Instead of Event Handler (OPC UA Alarms & Conditions)

The subscription methods also allow you to directly specify the callback method (delegate) to be invoked for each event notification you are subscribing to.

For detailed discussion on this subject, please refer to “Using Callback Methods Instead of Event Handlers” under the “OPC Data Access Tasks” chapter. All information presented there applies to OPC UA Alarms & Conditions as well.

The EasyUAMonitoredItemArguments object has an EventCallback property. This property specifies an optional method to be invoked for each event notification generated by the monitored item.

There is also an IEasyUAClient.SubscribeMonitoredItem extension method overload that accepts an event callback (EasyUAEventNotificationEventHandler).

.NET

// This example shows how to subscribe to event notifications and display each incoming event
// using a callback method that is provided as lambda expression.
//
// Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
// OPC client and subscriber examples in C# on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-CSharp .
// Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
// a commercial license in order to use Online Forums, and we reply to every post.

using System;
using OpcLabs.EasyOpc.UA;
using OpcLabs.EasyOpc.UA.AddressSpace.Standard;

namespace UADocExamples.AlarmsAndConditions
{
    partial class SubscribeEvent
    {
        public static void CallbackLambda()
        {
            UAEndpointDescriptor endpointDescriptor =
                "opc.tcp://opcua.demo-this.com:62544/Quickstarts/AlarmConditionServer";

            // Instantiate the client object
            var client = new EasyUAClient();

            Console.WriteLine("Subscribing...");
            // The callback is a lambda expression the displays the event
            client.SubscribeEvent(
                endpointDescriptor,
                UAObjectIds.Server,
                1000,
                (sender, eventArgs) => Console.WriteLine(eventArgs));
            // Remark: Production code needs to check eventArgs.Exception before accessing eventArgs.EventData.

            Console.WriteLine("Processing event notifications for 30 seconds...");
            System.Threading.Thread.Sleep(30 * 1000);

            Console.WriteLine("Unsubscribing...");
            client.UnsubscribeAllMonitoredItems();

            Console.WriteLine("Waiting for 2 seconds...");
            System.Threading.Thread.Sleep(2 * 1000);
        }
    }
}
' This example shows how to subscribe to event notifications and display each incoming event
' using a callback method that is provided as lambda expression.
'
' Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
' OPC client and subscriber examples in VB.NET on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-VBNET .
' Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
' a commercial license in order to use Online Forums, and we reply to every post.

Imports OpcLabs.EasyOpc.UA
Imports OpcLabs.EasyOpc.UA.AddressSpace.Standard

Namespace AlarmsAndConditions
    Partial Friend Class SubscribeEvent
        Public Shared Sub CallbackLambda()
            ' Instantiate the client object
            Dim client = New EasyUAClient()

            Console.WriteLine("Subscribing...")
            ' The callback is a lambda expression the displays the event
            client.SubscribeEvent( _
                "opc.tcp://opcua.demo-this.com:62544/Quickstarts/AlarmConditionServer", _
                UAObjectIds.Server, _
                1000, _
                Sub(sender, eventArgs) Console.WriteLine(eventArgs))
            ' Remark: Production code would check e.Exception before accessing e.EventData.

            Console.WriteLine("Processing event notifications for 10 seconds...")
            Threading.Thread.Sleep(10 * 1000)

            Console.WriteLine("Unsubscribing...")
            client.UnsubscribeAllMonitoredItems()

            Console.WriteLine("Waiting for 2 seconds...")
            Threading.Thread.Sleep(2 * 1000)
        End Sub
    End Class
End Namespace

Python

# This example shows how to subscribe to event notifications and display each incoming event
# using a callback method that is provided as lambda expression.
#
# Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
# OPC client and subscriber examples in Python on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-Python .
# Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
# a commercial license in order to use Online Forums, and we reply to every post.
# The QuickOPC package is needed. Install it using "pip install opclabs_quickopc".
import opclabs_quickopc
import time

# Import .NET namespaces.
from OpcLabs.EasyOpc.UA import *
from OpcLabs.EasyOpc.UA.AddressSpace.Standard import *


# Define which server we will work with.
endpointDescriptor = UAEndpointDescriptor('opc.tcp://opcua.demo-this.com:62544/Quickstarts/AlarmConditionServer')

# Instantiate the client object.
client = EasyUAClient()

print('Subscribing...')
# The callback is a lambda expression the displays the event.
IEasyUAClientExtension.SubscribeEvent(
    client,
    endpointDescriptor,
    UANodeDescriptor(UAObjectIds.Server),
    1000,
    EasyUAEventNotificationEventHandler(lambda server, eventArgs: print(eventArgs)))
# Remark: Production code needs to check eventArgs.Exception before accessing eventArgs.EventData.

print('Processing event notifications for 30 seconds...')
time.sleep(30)

print('Unsubscribing...')
client.UnsubscribeAllMonitoredItems()

print('Waiting for 2 seconds...')
time.sleep(2)

print('Finished.')

 

 

See Also